import { lazyReportBatch } from '../export';

/**
 * 导出 XMLHttpRequest 原型对象
 */
export const originalProto = XMLHttpRequest.prototype;
/**
 * 导出 XMLHttpRequest 原型对象的 open 方法
 */
export const originalOpen = originalProto.open;
/**
 * 导出 XMLHttpRequest 原型对象的 send 方法
 */
export const originalSend = originalProto.send;

/**
 * 重写 XMLHttpRequest 的 open 和 send 方法，用于监控请求性能
 */
const overWriteOpenAndSend = () => {
  // 重写 open 方法
  originalOpen.open = function newOpen(...args) {
    // 记录请求的 URL
    this.url = args[1];
    // 记录请求的方法
    this.method = args[0];
    // 调用原始的 open 方法
    originalOpen.apply(this, args);
  };

  // 重写 send 方法
  originalOpen.send = function newSend(...args) {
    // 记录请求开始时间
    this.startTime = Date.now();
    /**
     * 请求完成时的回调函数，用于计算请求耗时并生成报告数据
     */
    const onLoaded = () => {
      // 记录请求结束时间
      this.endTime = Date.now();
      // 计算请求耗时
      this.duration = this.endTime - this.startTime;
      const { url, method, startTime, endTime, duration, status } = this;
      // 生成请求性能报告数据
      const reportData = {
        duration,
        startTime,
        endTime,
        status,
        url,
        method: method.toUpperCase(),
        type: 'performance',
        success: status >= 200 && status < 300,
        subType: 'xhr',
        title: 'xhr 请求性能指标',
      };
      // 发送数据
      lazyReportBatch(reportData);
      // 移除 loadend 事件监听器，避免重复触发
      this.removeEventListener('loadend', onLoaded, true);
    };
    // 为请求添加 loadend 事件监听器
    this.addEventListener('loadend', onLoaded, true);
    // 调用原始的 send 方法
    originalSend.apply(this, args);
  };
};

/**
 * 初始化 XHR 监控，调用 overWriteOpenAndSend 函数重写方法
 */
export default function xhr() {
  overWriteOpenAndSend();
}
